home *** CD-ROM | disk | FTP | other *** search
/ Languguage OS 2 / Languguage OS II Version 10-94 (Knowledge Media)(1994).ISO / language / embedded / 68hc11 / smallc11.arc / CC6.C < prev    next >
Text File  |  1988-06-27  |  4KB  |  263 lines

  1. #include    <stdio.h>
  2. #include    "ccdef.c"
  3.  
  4. extern char
  5.   symtab[SYMTBSZ],
  6.   stage[STAGESIZE],
  7.   macq[MACQSIZE],
  8.   pline[LINESIZE],
  9.   mline[LINESIZE],
  10.   alarm, *glbptr, *line, *lptr, *cptr, *cptr2,    *cptr3,
  11.  *locptr, msname[NAMESIZE],  pause,  quote[2],
  12.  *stagelast, *stagenext;
  13.  
  14. extern int
  15. ncmp,
  16.   wq[WQTABSZ],
  17.   ccode,  ch,  csp,  eof,  errflag,  iflevel,
  18.   macptr,  nch,
  19.   nxtlab,  op[16],  opindex,  opsize,  pptr,
  20.   skiplevel,  *wqptr;
  21.  
  22. extern FILE
  23.   *input,
  24.   *input2,
  25.   *output,
  26.   *listfp;
  27.  
  28. illname()  {
  29.    error("illegal symbol name");
  30.    junk();
  31.    }
  32.  
  33. multidef(sname)  char *sname;  {
  34.    error("already defined");
  35.    }
  36.  
  37. needlval()  {
  38.    error("must be lvalue");
  39.    }
  40.  
  41. /*
  42. ** force upper case alphabetics
  43. */
  44. upper(c)  {
  45.   if((c >= 'a') & (c <= 'z')) return (c - 32);
  46.   else return c;
  47.   }
  48.  
  49. /*
  50. ** return next avail internal label number
  51. */
  52. getlabel() {
  53.   return(++nxtlab);
  54.   }
  55.  
  56. /*
  57. ** post a label in the program
  58. */
  59. postlabel(label) int label; {
  60.   printlabel(label);
  61.   ot("equ *");
  62.   nl();
  63.   }
  64.  
  65. /*
  66. ** print specified number as a label
  67. */
  68. printlabel(label)  int label; {
  69.   outstr("cc");
  70.   outdec(label);
  71.   }
  72.  
  73. /*** test if given character is alphabetic*/
  74. alpha(c) {
  75.   return (((c>='a')&(c<='z'))|((c>='A')&(c<='Z'))|(c=='_'));
  76.   }
  77.  
  78. /*** test if given character is numeric*/
  79. numeric(c) {
  80.   return((c>='0')&(c<='9'));
  81.   }
  82.  
  83. /*
  84. ** test if given character is alphanumeric
  85. */
  86. an(c)  {
  87.   return ((alpha(c))|(numeric(c)));
  88.   }
  89.  
  90. gch() {
  91.   int c;
  92.   if(c=ch) bump(1);
  93.   return c;
  94.   }
  95.  
  96. bump(n) int n; {
  97.   if(n) lptr=lptr+n;
  98.   else    lptr=line;
  99.   if(ch=nch= *lptr) nch= *(lptr+1);
  100.   }
  101.  
  102. kill() {
  103.   *line=0;
  104.   bump(0);
  105.   }
  106.  
  107. keepch(c)  {
  108.   if(pptr<LINEMAX) pline[++pptr]=c;
  109.   }
  110.  
  111. noiferr() {
  112.   error("no matching #if...");
  113.   errflag=0;
  114.   }
  115.  
  116. ol(ptr)  char ptr[];  {
  117.   ot(ptr);
  118.   nl();
  119.   }
  120.  
  121. ot(ptr) char ptr[]; {
  122.   outbyte(' ');
  123.   outstr(ptr);
  124.   }
  125.  
  126. outstr(ptr) char ptr[]; {
  127.   /* must work with symbol table names terminated by length */
  128.   while(*ptr >= ' ') outbyte(*ptr++);
  129.   }
  130.  
  131. nl() {
  132.   outbyte('\n');
  133.   }
  134.  
  135. tab() {
  136.   outbyte(' ');
  137.   }
  138.  
  139. error(msg) char msg[]; {
  140.   int handl;
  141.   handl = fileno(stdout);    /* get handle */
  142.   printf("%s\n",line);
  143.   errout(msg, stdout);
  144.   if(!isatty(handl))        /* avoid double error msg's to stdout */
  145.   {
  146.       fprintf(stderr,"\n%s\n",line);
  147.     errout(msg, stderr);
  148.   }
  149. }
  150.  
  151. errout(msg, fp) char msg[]; FILE *fp; {
  152.   extern int reperr;
  153.   int k; k=line+2;
  154.   while(k++ <= lptr)
  155.     fputc(' ',fp);
  156.   fprintf(fp,"/\\\n");
  157.   fprintf(fp,"**** ");
  158.   fprintf(fp,"%s\n",msg);
  159.   reperr = YES;
  160.   }
  161.  
  162. outdec(number)    int number; {
  163.   int k,zs;
  164.   char c;
  165.   zs = 0;
  166.   k=10000;
  167.   if (number<0) {
  168.     number=(-number);
  169.     outbyte('-');
  170.     }
  171.   while (k>=1) {
  172.     c=number/k + '0';
  173.     if ((c!='0')|(k==1)|(zs)) {
  174.       zs=1;
  175.       outbyte(c);
  176.       }
  177.     number=number%k;
  178.     k=k/10;
  179.     }
  180.   }
  181.  
  182. streq(str1,str2)  char str1[],str2[]; {
  183.   int k;
  184.   k=0;
  185.   while (str2[k]) {
  186.     if ((str1[k])!=(str2[k])) return 0;
  187.     ++k;
  188.     }
  189.   return k;
  190.  }
  191.  
  192. match(lit)  char *lit; {
  193.   int k;
  194.   blanks();
  195.   if (k=streq(lptr,lit)) {
  196.     bump(k);
  197.     return YES;
  198.     }
  199.   return NO;
  200.   }
  201.  
  202. amatch(lit,len)  char *lit;int len; {
  203.   int k;
  204.   blanks();
  205.   if (k=astreq(lptr,lit,len)) {
  206.     bump(k);
  207.     while(an(ch)) inbyte();
  208.     return 1;
  209.     }
  210.   return 0;
  211.  }
  212.  
  213. blanks() {
  214.   while(1) {
  215.     while(ch) {
  216.       if(white()) gch();
  217.       else return;
  218.       }
  219.     if(line==mline) return;
  220.     preprocess();
  221.     if(eof)break;
  222.     }
  223.   }
  224.  
  225. outbyte(c) {
  226.   if(stagenext) {
  227.     if(stagenext==stagelast) {
  228.       error("staging buffer overflow");
  229.       return 0;
  230.       }
  231.     else
  232.     *stagenext++ = c;
  233.     }
  234.   else putchar(c);
  235.   return c;
  236.   }
  237.  
  238.  
  239. /*
  240. ** verify compile ends outside any function
  241. */
  242. outside()  {
  243.   if (ncmp) error("no closing bracket");
  244.   }
  245.  
  246. /*
  247. ** semicolon enforcer
  248. **
  249. ** called whenever syntax requires a semicolon
  250. */
  251. ns()  {
  252.   if(match(";") == 0) error("no semicolon");
  253.   else errflag = 0;
  254.   }
  255.  
  256. white() {
  257.   /* test for stack/program overlap */
  258.   /* primary -> symname -> blanks -> white */
  259.   if(*lptr==' ')   return 1;
  260.   if(*lptr==TAB)   return 1;
  261.   return 0;
  262.   }
  263.